﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace Utility.Invoice
{
    public class NIP
    {
        /// <summary>
        /// Wyszukaj numer NIP odbiorcy w tekście faktury
        /// </summary>
        /// <param name="textToSearch">tekst faktury do przeszukania</param>
        /// <param name="leaveOut">pomin ten numer</param>
        /// <returns>zwraca znaleziony numer NIP (jesli więcej niz 1 - zwraca pierwszy pasujący) lub zwraca string.Empty jesli nie znajdzie</returns>
        public static string FindNIPNumber(string textToSearch, string leaveOut)
        {
            textToSearch = textToSearch.Replace("-", ""); //pozbądź się myślników w numerze
            leaveOut = leaveOut.Replace("-", "");
            MatchCollection foundedMoney;
            Regex regFindMoney = new Regex(@"[0-9]{10}", RegexOptions.Compiled);

            foundedMoney = regFindMoney.Matches(textToSearch);

            //znajdz max
            foreach (Match match in foundedMoney)
            {
                if (Utility.Invoice.NIP.IsValid(match.Value) && (leaveOut != match.Value)) //zwroc tylko ten ktory jest rozny od podstawowego
                {
                    return match.Value;
                }
            }

            return string.Empty;
        }

        private static readonly int[] _ValidNums = { 6, 5, 7, 2, 3, 4, 5, 6, 7 };
        /// <summary>
        /// dokonuje sprawdzenia czy podany numer jest numerem NIP
        /// </summary>
        /// <param name="Nip">kandydat</param>
        /// <returns></returns>
        public static bool IsValid(string Nip)
        {
            int _Sum;
            if (!Regex.IsMatch(Nip, @"^[\d]{10}$"))
                return false;
            _Sum = 0;
            for (int t = 8; t >= 0; t--)
                _Sum += (_ValidNums[t]) * Convert.ToInt32(Nip.Substring(t, 1));
            return ((_Sum % 11) == 10 ? false : ((_Sum % 11) == Convert.ToInt32(Nip.Substring(9, 1))));
        }
    }
}
